#pragma once

#include <memory>
#include <string>
#include <vector>
#include "onvif_types.h"

namespace El {
namespace Onvif {

/**
 * @brief ONVIF服务器接口
 * 
 * 提供标准化的IP摄像头Web Services接口
 */
class IOnvifServer {
public:
    virtual ~IOnvifServer() = default;

    /**
     * @brief 启动ONVIF服务
     * @return true if successful, false otherwise
     */
    virtual bool Start() = 0;

    /**
     * @brief 停止ONVIF服务
     */
    virtual void Stop() = 0;

    /**
     * @brief 检查服务是否正在运行
     * @return true if running, false otherwise
     */
    virtual bool IsRunning() const = 0;

    /**
     * @brief 设置设备信息
     */
    virtual void SetDeviceInformation(const DeviceInformation& deviceInfo) = 0;
    virtual DeviceInformation GetDeviceInformation() const = 0;

    /**
     * @brief 设置网络配置
     */
    virtual void SetNetworkConfiguration(const NetworkInterface& networkConfig) = 0;
    virtual NetworkInterface GetNetworkConfiguration() const = 0;

    /**
     * @brief 设置ONVIF端口
     */
    virtual void SetOnvifPort(int port) = 0;
    virtual int GetOnvifPort() const = 0;

    /**
     * @brief 启用/禁用WS-Discovery
     */
    virtual void EnableWSDiscovery(bool enable) = 0;
    virtual bool IsWSDiscoveryEnabled() const = 0;

    /**
     * @brief 设置安全模式
     */
    virtual void SetSecurityMode(SecurityMode mode) = 0;
    virtual SecurityMode GetSecurityMode() const = 0;

    /**
     * @brief 用户管理
     */
    virtual bool AddUser(const User& user) = 0;
    virtual bool RemoveUser(const std::string& username) = 0;
    virtual std::vector<User> GetUsers() const = 0;

    /**
     * @brief 媒体配置文件管理
     */
    virtual bool AddMediaProfile(const MediaProfile& profile) = 0;
    virtual bool RemoveMediaProfile(const std::string& token) = 0;
    virtual std::vector<MediaProfile> GetMediaProfiles() const = 0;

    /**
     * @brief 获取服务能力
     */
    virtual ServiceCapabilities GetServiceCapabilities() const = 0;
};

/**
 * @brief ONVIF服务器工厂接口
 */
class IOnvifServerFactory {
public:
    virtual ~IOnvifServerFactory() = default;
    
    /**
     * @brief 创建ONVIF服务器实例
     * @param port HTTP服务端口
     * @return ONVIF服务器实例
     */
    virtual std::unique_ptr<IOnvifServer> CreateServer(int port = 8080) = 0;
};

/**
 * @brief 创建ONVIF服务器工厂
 * @return 工厂实例
 */
std::unique_ptr<IOnvifServerFactory> CreateOnvifServerFactory();

} // namespace Onvif
} // namespace El